import java.util.*;
public class Main {
   /* 给你一个数组 prices ，其中 prices[i] 是商店里第 i 件商品的价格。
    商店里正在进行促销活动，如果你要买第 i 件商品，那么你可以得到与 prices[j] 相等的折扣，
    其中 j 是满足 j > i 且 prices[j] <= prices[i] 的 最小下标 ，如果没有满足条件的 j ，你将没有任何折扣。
    请你返回一个数组，数组中第 i 个元素是折扣后你购买商品 i 最终需要支付的价格。*/
   public static int[] exchange(int[] prices) {
       //暴力解法
       /*
       int n=prices.length;
       for(int i=0;i<n;i++){
           int discount=0;
           for(int j=i+1;j<n;j++){
               if(prices[i]>prices[j])
                   discount=prices[j];
           }
           prices[i]-=discount;
       }
       return prices;*/
       //单调栈法
       int n=prices.length;
       Deque<Integer> arr=new ArrayDeque<>();
       int[] nums=new int[n];
       for(int i=n-1;i>=0;i--){
           //从左至右遍历，确保栈顶为右边的值
           //处理比遍历值大的数
           while(!arr.isEmpty()&&prices[arr.peek()]>prices[i]){
               arr.pop();//弹出
           }
           nums[i]=arr.isEmpty()?prices[i]:prices[i]-prices[arr.peek()];
           arr.push(i);//加入当前索引
       }
       return nums;
   }
    public static void main(String[] args) {
      Scanner sc=new Scanner(System.in);
      int n=sc.nextInt();
      int[] prices=new int[n];
      for(int i=0;i<n;i++){
          prices[i]=sc.nextInt();
      }
      int[] discount=exchange(prices);
      System.out.println(Arrays.toString(discount));
    }
}